/*
* #%L
* wcm.io
* %%
* Copyright (C) 2014 wcm.io
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
package io.wcm.wcm.ui.extjs.provider.impl.servlets;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.Session;
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.commons.json.JSONArray;
import org.apache.sling.commons.json.JSONException;
import org.apache.sling.commons.json.JSONObject;
import org.apache.sling.testing.mock.jcr.MockJcr;
import org.apache.sling.testing.mock.sling.ResourceResolverType;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import io.wcm.sling.commons.resource.ImmutableValueMap;
import io.wcm.testing.mock.aem.junit.AemContext;
import io.wcm.wcm.ui.extjs.provider.AbstractPageProvider;
@RunWith(MockitoJUnitRunner.class)
public class TemplateFilterPageTreeProviderTest {
private static final String TEMPLATE_1 = "/apps/app1/templates/template1";
private static final String TEMPLATE_2 = "/apps/app1/templates/template2";
@Rule
public AemContext context = new AemContext(ResourceResolverType.JCR_MOCK);
@Before
public void setUp() throws Exception {
context.create().page("/content/sample/en");
context.create().page("/content/sample/en/page1", TEMPLATE_1, "title1");
context.create().page("/content/sample/en/page1/page11", TEMPLATE_2, "title11");
context.create().page("/content/sample/en/page1/page11/page111", TEMPLATE_1, "title111");
context.create().page("/content/sample/en/page1/page11/page112", TEMPLATE_1, "title111");
context.create().page("/content/sample/en/page1/page12", TEMPLATE_2, "title12");
context.create().page("/content/sample/en/page1/page12/page121", TEMPLATE_2, "title121");
context.create().page("/content/sample/en/page1/page12/page122", TEMPLATE_2, "title122");
context.create().page("/content/sample/en/page2", TEMPLATE_1, "title2");
}
@Test
public void testWithOutTemplates() throws Exception {
context.request().setParameterMap(ImmutableValueMap.of(AbstractPageProvider.RP_PATH, "/content/sample/en"));
JSONArray result = getJsonResult();
assertEquals(0, result.length());
}
@Test
public void testWithTemplate1() throws Exception {
context.request().setParameterMap(ImmutableValueMap.of(AbstractPageProvider.RP_PATH, "/content/sample/en",
TemplateFilterPageTreeProvider.RP_TEMPLATE, new String[] {
TEMPLATE_1
}));
// simulate query result
mockQueryResult("/content/sample/en/page1",
"/content/sample/en/page1/page11/page111",
"/content/sample/en/page1/page11/page112",
"/content/sample/en/page2");
JSONArray result = getJsonResult();
assertEquals(2, result.length());
assertItem(result.getJSONObject(0), "page1", "title1", TEMPLATE_1, false);
assertItem(result.getJSONObject(1), "page2", "title2", TEMPLATE_1, true);
JSONArray page1children = result.getJSONObject(0).getJSONArray("children");
assertEquals(1, page1children.length());
assertItem(page1children.getJSONObject(0), "page11", "title11", TEMPLATE_2, false);
assertNull(page1children.getJSONObject(0).optJSONArray("children"));
}
@Test
public void testWithTemplate1an2() throws Exception {
context.request().setParameterMap(ImmutableValueMap.of(AbstractPageProvider.RP_PATH, "/content/sample/en",
TemplateFilterPageTreeProvider.RP_TEMPLATE, new String[] {
TEMPLATE_1,
TEMPLATE_2
}));
// simulate query result
mockQueryResult("/content/sample/en/page1",
"/content/sample/en/page1/page11",
"/content/sample/en/page1/page11/page111",
"/content/sample/en/page1/page11/page112",
"/content/sample/en/page1/page12",
"/content/sample/en/page1/page12/page121",
"/content/sample/en/page1/page12/page122",
"/content/sample/en/page2");
JSONArray result = getJsonResult();
assertEquals(2, result.length());
assertItem(result.getJSONObject(0), "page1", "title1", TEMPLATE_1, false);
assertItem(result.getJSONObject(1), "page2", "title2", TEMPLATE_1, true);
JSONArray page1children = result.getJSONObject(0).getJSONArray("children");
assertEquals(2, page1children.length());
assertItem(page1children.getJSONObject(0), "page11", "title11", TEMPLATE_2, false);
assertNull(page1children.getJSONObject(0).optJSONArray("children"));
assertItem(page1children.getJSONObject(1), "page12", "title12", TEMPLATE_2, false);
assertNull(page1children.getJSONObject(1).optJSONArray("children"));
}
private JSONArray getJsonResult() throws Exception {
TemplateFilterPageTreeProvider underTest = context.registerInjectActivateService(new TemplateFilterPageTreeProvider());
underTest.service(context.request(), context.response());
if (context.response().getStatus() == HttpServletResponse.SC_OK) {
return new JSONArray(context.response().getOutputAsString());
}
else {
return null;
}
}
private void mockQueryResult(String... paths) {
List<String> resultPaths = ImmutableList.copyOf(paths);
List<Node> resultNodes = Lists.transform(resultPaths, new Function<String, Node>() {
@Override
public Node apply(String path) {
return context.resourceResolver().getResource(path).adaptTo(Node.class);
}
});
MockJcr.setQueryResult(context.resourceResolver().adaptTo(Session.class), resultNodes);
}
private void assertItem(JSONObject jsonObject, String name, String title, String template,
boolean leaf) throws JSONException {
assertEquals(name, jsonObject.get("name"));
assertEquals(title, jsonObject.get("text"));
assertEquals("cq:Page", jsonObject.get("type"));
assertEquals(template, jsonObject.get("template"));
assertEquals("page", jsonObject.get("cls"));
assertEquals(leaf, jsonObject.optBoolean("leaf"));
}
}